package com.learn.demo.netty.codec;

import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;

import java.nio.charset.StandardCharsets;

/**
 * 自定义服务端消息处理handler，需要继承HandlerAdapter
 */
public class NettyServerHandlerDemo extends SimpleChannelInboundHandler<MyDataInfo.MyMessage> {

    /**
     * 向客户端发送数据
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        ctx.writeAndFlush(Unpooled.copiedBuffer("Hello Client !".getBytes(StandardCharsets.UTF_8)));
    }

    /**
     * 读取数据事件，可以接收和处理客户端发送的消息
     * @param ctx ChannelHandlerContext上下文信息包含管道(pipeline)和通道(channel)及地址信息等
     * @param cause
     * @throws Exception
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();
    }

    /**
     * 接收客户端消息
     * @author banjiawei
     * @date 2021/6/6
     * @param ctx
     * @param msg
     * @return void
     */
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, MyDataInfo.MyMessage msg) throws Exception {
        MyDataInfo.MyMessage.DataType dataType = msg.getDataType();
        if(dataType == MyDataInfo.MyMessage.DataType.StudentType){
            System.out.println("客户端发送的学生数据： " + msg.getStudent().getId() + " " + msg.getStudent().getName());
            return;
        }
        if(dataType == MyDataInfo.MyMessage.DataType.WorkerType){
            System.out.println("客户端发送的工人数据： " + msg.getWorker().getName() + " " + msg.getWorker().getAge());
            return;
        }
        System.out.println("客户端发送的数据类型不正确");
    }
}
